/*
 * bot.cpp
 *
 *  Created on: Oct 21, 2011
 *      Author: igor
 */

#include "bot.h"
#include <cstdlib>
#include <ctime>

#include "../control/ElectionManager.h"
#include "../control/CargoDao.h"
#include "../control/CandidatoDao.h"
#include "../control/VotanteDao.h"
#include "../control/EleccionDao.h"

#include "../../util/NodoEleccion.h"
#include "../../util/NodoLista.h"
#include "../../util/NodoCandidato.h"

#include "../Eleccion.h"
#include "../Lista.h"
#include "../Candidato.h"
#include "../loader/CsvLoader.h"

bot::bot() {
	// TODO Auto-generated constructor stub

}

bot::~bot() {
	// TODO Auto-generated destructor stub
}

void bot::voteOnce(Votante* votante){

	int loginRandom = getRandomOption(0, 100);
	bool log;
	if(loginRandom < 10) {
		if(loginRandom < 3){
			log = loginAsUser("0", "XXX");
		}else{
			log = loginAsUser(Utils::intToString(votante->getDni()), "XXX");
		}
	}else {
		log = loginAsUser(Utils::intToString(votante->getDni()), votante->getPassword());
	}

	if(log){
		selectEleccion(electionManager);
		electionManager->logout();
	}
}


bool bot::loginAsUser(string usuario, string password){
	int usrId = Utils::stringToInt(usuario);
	int loginResult = electionManager->login(usrId,password);

	if(loginResult != 1){
		Logger::createEntryLog("bot trato de logiarse con USUARIO O CONTRASEÑA INVALIDO",Logger::ERROR);
		return false;
	}else{
		Logger::createEntryLog("bot se logio como: " + Utils::intToString(electionManager->getUser()->getDni())+" LOGIN",Logger::LOG);
		return true;
	}
}

int bot::getRandomOption(int from, int to){
	srand((unsigned)time(0));
	return from + (rand()%(to+1));
}

void bot::selectEleccion(ElectionManager* electionManager) {

	List* elecciones = electionManager->getEleccionesDisponibles();
	int nElecciones = elecciones->getSize();
	if(nElecciones > 0){
		int randomEleccion = getRandomOption(0, nElecciones-1);

		Eleccion* el = ((NodoEleccion*)elecciones->get(randomEleccion))->getNodeValue();
		Logger::createEntryLog("bot elige: " + CargoDao::initialize(el->getCargo())->getTitulo(),Logger::LOG);

		electionManager->selectEleccion(((NodoEleccion*)elecciones->get(randomEleccion))->getNodeValue());
		selectLista(electionManager);
	}else{
		Logger::createEntryLog("bot no tiene disponibles elecciones",Logger::LOG);
	}

	delete elecciones;
}

void bot::selectLista(ElectionManager* electionManager) {

	List* listas = electionManager->getListasDisponibles();
	int nListas = listas->getSize();
	if(nListas > 0){
		int resultado = 0;
			do{
				int randomLista = getRandomOption(0, nListas-1);
				Lista* l = ((NodoLista*)listas->get(randomLista))->getNodeValue();
				Logger::createEntryLog("bot elige: Lista " + Utils::intToString(l->getNumeroLista()) + " - " + l->getNombre(),Logger::LOG);

				Logger::createEntryLog(Utils::intToString(electionManager->getUser()->getDni())+" VOTO",Logger::LOG);
				resultado = confirmarVoto(electionManager, ((NodoLista*)listas->get(randomLista))->getNodeValue());
				if(resultado == 1){
					delete listas;
				}
				else{
					Logger::createEntryLog("bot logiado como : " + Utils::intToString(electionManager->getUser()->getDni())+" CAMBIO VOTO",Logger::LOG);
				}
			}while(resultado != 1);
	}else{
		Logger::createEntryLog("No hay listas registradas para la eleccion seleccionada por el bot",Logger::LOG);
	}

}

int bot::confirmarVoto(ElectionManager* electionManager, Lista* lista){

	int confirmacionRandom = getRandomOption(0, 1);

	if(confirmacionRandom == 1){
		electionManager->confirmVote(lista);
		Logger::createEntryLog(Utils::intToString(electionManager->getUser()->getDni())+" VOTO CONFIRMADO",Logger::LOG);
		return confirmacionRandom;
	}

	return confirmacionRandom;
}

int bot::runSimulation()
{
	ElectionManager* manager = new ElectionManager();
	this->electionManager = manager;
	List* users = this->electionManager->getUserManager()->returnAll();
	Logger::createEntryLog("INICIA SIMULACION DE VOTACION",Logger::LOG);
	for(int i = 0; i < users->getSize(); i++) {
		NodoVotante* nodo = (NodoVotante*) users->get(i);
		Votante* votante = nodo->getNodeValue();
		voteOnce(votante);
	}
	Logger::createEntryLog("FINALIZA SIMULACION DE VOTACION",Logger::LOG);
	return 0;
}









